import pandas as pd
import pandas as pd
import numpy as np
import re
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

# 指定文件路径
file_path = 'F:\\scrapy\\myscrapy\\book.json'

# 读取 JSON 文件并解析为 Pandas DataFrame
df = pd.read_json(file_path)

# 清洗价格数据，去除'¥'符号并转换为数值
df['price'] = df['price'].astype(str).str.replace('¥', '').str.split('¥').apply(lambda x: pd.to_numeric(x[0], errors='coerce') if x else None)

# 清洗评分数据，提取百分比数值（这里的数据格式不太标准，需要特殊处理）
df['rating'] = df['rating'].str.extract(r'(\d+)%')[0].astype(float) / 100  # 转换为0-1之间的浮点数

# 清洗评论数量数据，去除“条评论”字样并转换为数值
df['comments_count'] = df['comments_count'].str.replace('条评论', '').fillna('0')

# 尝试将评论数转换为整数，无法转换的将被设置为 NaN（使用 errors='coerce'）
df['comments_count'] = pd.to_numeric(df['comments_count'], errors='coerce')

# 清洗标题数据：去除特殊字符（这里已经相对干净，但可以做进一步标准化）
def clean_title(title):
    title = re.sub(r'[^\w\s\u4e00-\u9fff]+', '', title)  # 保留中英文和中文标点
    title = title.lower().strip()  # 转换为小写并去除首尾空格
    return title

df['title'] = df['title'].apply(clean_title)
# 可视化价格分布
plt.figure(figsize=(10, 6))
sns.histplot(df['price'], bins=30, kde=True)
plt.title('Distribution of Book Prices')
plt.xlabel('Price')
plt.ylabel('Frequency')
plt.xlim(0, max(df['price'].quantile(0.95), 1000))  # 限制x轴范围到95%分位数或1000（取较大者）
plt.show()

# 可视化评分分布
plt.figure(figsize=(10, 6))
sns.histplot(df['rating'], bins=10, kde=True)
plt.title('Distribution of Book Ratings')
plt.xlabel('Rating')
plt.ylabel('Frequency')
plt.show()

# 可视化评论数量分布
plt.figure(figsize=(10, 6))
sns.histplot(df['comments_count'], bins=30, kde=True)
plt.title('Distribution of Comments Count')
plt.xlabel('Comments Count')
plt.ylabel('Frequency')
plt.xscale('log')  # 使用对数刻度以更好地显示大范围的数据
plt.show()
# 根据价格将书籍分为高价和低价两类（这里使用中位数作为阈值）
median_price = df['price'].median()
df['price_category'] = df['price'].apply(lambda x: 'High' if x > median_price else 'Low')

# 将数据分为训练集和测试集（这里使用随机划分）
X_train, X_test, y_train, y_test = train_test_split(df['title'], df['price_category'], test_size=0.2, random_state=42)

# 使用TF-IDF向量化器和朴素贝叶斯分类器进行文本分类
model = make_pipeline(TfidfVectorizer(), MultinomialNB())
model.fit(X_train, y_train)

# 预测测试集并评估模型性能
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Model Accuracy: {accuracy:.2f}')
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))